import { validateOrReject, IsDate, IsOptional } from 'class-validator';
import {
  BeforeInsert,
  BeforeUpdate,
  Column,
  PrimaryGeneratedColumn,
  DeleteDateColumn,
} from 'typeorm';

/**
 * TypeORM主要关注于数据库交互和对象关系映射，而class-validator则专注于数据验证。
 */
export class CommonEntity {
  @PrimaryGeneratedColumn('uuid')
  id: string;

  @Column({
    comment: '创建时间',
    type: 'timestamp',
  })
  createdAt: Date;

  @Column({
    comment: '创建者',
    nullable: true,
  })

  // @IsOptional()用于在类属性上声明该属性在验证过程中是可选的。
  @IsOptional()
  createdBy: string;

  @Column({
    comment: '修改时间',
    type: 'timestamp',
    nullable: true,
  })
  updatedAt: Date;

  @Column({
    comment: '修改者',
    nullable: true,
  })
  @IsOptional()
  updatedBy: string;

  @Column({
    comment: '删除时间',
    type: 'timestamp',
    nullable: true,
  })

  // @DeleteDateColumn()它用于在实体类（Entity）的属性上标记一个列，
  // 该列用于存储记录被软删除的时间戳。
  @DeleteDateColumn()
  // @IsDate()用于在类属性上声明该属性的值应该是一个有效的日期。
  // 这个装饰器会检查属性值是否符合 JavaScript 的 Date 对象格式，
  // 或者是否是一个可以被 Date 构造函数成功解析的日期字符串。
  @IsDate()
  @IsOptional()
  deletedAt: Date;

  @Column({
    comment: '删除者',
    nullable: true,
  })
  @IsOptional()
  deletedBy: string;

  @BeforeInsert()
  setCreatedAt() {
    const now = new Date();
    this.createdAt = now;
    this.updatedAt = now;
  }

  @BeforeUpdate()
  setUpdatedAt() {
    this.updatedAt = new Date();
  }

  @BeforeInsert()
  async validateBeforeInsert() {
    await validateOrReject(this);
  }

  @BeforeUpdate()
  async validateBeforeUpdate() {
    await validateOrReject(this, { skipMissingProperties: true });
  }
}
